HashtableLookup ================= 根据输入的键值在已排序的键数组中执行二分查找,返回对应的字符串值以及查找命中标记。 虽然名为 `HashtableLookup`,但实际使用二分查找(`bsearch`)算法,而非哈希表。要求 `keys_tensor` 必须已按升序排序。 .. math:: \forall i \in [0, input\_size), \quad \begin{cases} \text{if } \exists j \in [0, keys\_size) \text{ s.t. } keys[j] = input[i], & \begin{cases} output[i] \leftarrow values[j] \\ hits[i] \leftarrow 1 \end{cases} \\[10pt] \text{else}, & \begin{cases} output[i] \leftarrow \text{空字符串} \\ hits[i] \leftarrow 0 \end{cases} \end{cases} 输入: - **input_tensor** - 要查找的键数组地址(int32类型)。 - **keys_tensor** - 已排序的键数组地址(int32类型,必须按升序排序)。 - **values_tensor** - 值数组地址(字符串tensor,与keys_tensor一一对应)。 - **input_size** - 输入键数组的元素个数。 - **keys_size** - 键数组的元素个数(等于values_tensor中字符串的个数)。 - **core_mask(可选)** - 核掩码(仅适用于共享存储版本)。 输出: - **output_tensor** - 查找结果输出地址(字符串tensor,与input_tensor长度相同)。 - **hits_tensor** - 命中标记输出地址(uint8类型,1表示找到,0表示未找到)。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持int32键类型,字符串值类型 - MT7004 支持int32键类型,字符串值类型 - keys_tensor 必须已按升序排序,否则查找结果不正确 - 使用二分查找算法,时间复杂度为 O(log n) - 如果查找失败,output_tensor 对应位置为空字符串,hits_tensor 对应位置为0 **共享存储版本:** .. c:function:: void i32_hashtablelookup_s(int* input_tensor, int* keys_tensor, void* values_tensor, void* output_tensor, uint8_t* hits_tensor, int input_size, int keys_size, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 15-17 //FT78NE示例 #include #include int main(int argc, char* argv[]) { int *input_tensor = (int *)0xA0000000; //input在DDR空间 int *keys_tensor = (int *)0xB0000000; //已排序的键数组 void *values_tensor = (void *)0xC0000000; //字符串值数组 void *output_tensor = (void *)0xD0000000; //输出字符串数组 uint8_t *hits_tensor = (uint8_t *)0xE0000000; //命中标记数组 int input_size = 100; //输入键的个数 int keys_size = 50; //键值对的个数 int core_mask = 0xff; i32_hashtablelookup_s(input_tensor, keys_tensor, values_tensor, output_tensor, hits_tensor, input_size, keys_size, core_mask); return 0; } **私有存储版本:** .. c:function:: void i32_hashtablelookup_p(int* input_tensor, int* keys_tensor, void* values_tensor, void* output_tensor, uint8_t* hits_tensor, int input_size, int keys_size) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 14-16 //FT78NE示例 #include #include int main(int argc, char* argv[]) { int *input_tensor = (int *)0x10810000; //input在L2空间 int *keys_tensor = (int *)0x10820000; //已排序的键数组 void *values_tensor = (void *)0x10830000; //字符串值数组 void *output_tensor = (void *)0x10840000; //输出字符串数组 uint8_t *hits_tensor = (uint8_t *)0x10850000; //命中标记数组 int input_size = 100; //输入键的个数 int keys_size = 50; //键值对的个数 i32_hashtablelookup_p(input_tensor, keys_tensor, values_tensor, output_tensor, hits_tensor, input_size, keys_size); return 0; }